AWS CDK で、Kinesis Data streams をターゲットとした EventBridge Rules に DLQ を簡単に設定可能になりました
こんにちは、製造ビジネステクノロジー部の若槻です。
AWS CDK の最新のリリースで、下記のアップデートが追加されていました。
events-target: support Dead Letter Queue for Kinesis Stream Event Target (#31435) (358f231), closes #31428 #13600
Amazon EventBridge のルールには、ターゲットへの配信が失敗した際のメッセージ送信先として Dead Letter Queue (DLQ) を設定できます。
AWS CDK でターゲットを構成した場合に、今までは下記をターゲットにした場合のみ L2 Construct で DLQ を設定できていました。
- Codebuild
- CodePipeline
- Lambda
- StepFunctions
- LogGroup
- SQSQueue
- SNSTopic
- ECSTask
それが今回の AWS CDK のアップデートにより、上記に加えて Kinesis Data streams をターゲットとしている場合にも DLQ を L2 Construct で簡単に設定できるようになりました。
試してみた
ターゲットに DLQ を設定しない場合
まずは DLQ を設定しない場合を確認してみます。
次のように Kinesis Data streams をターゲットとして Event Rule を構成する CDK コードを作成します。ここでは DLQ は設定しません。
import * as events from 'aws-cdk-lib/aws-events';
import * as event_targets from 'aws-cdk-lib/aws-events-targets';
import * as kinesis from 'aws-cdk-lib/aws-kinesis';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class CdkSampleStack extends cdk.Stack {
constructor(scope: Construct, id: string) {
super(scope, id);
const myKinesisStream = new kinesis.Stream(this, 'MyKinesisStream');
const everyMinuteEventRule = new events.Rule(this, 'EveryMinuteEventRule', {
schedule: events.Schedule.rate(cdk.Duration.minutes(1)),
});
everyMinuteEventRule.addTarget(
new event_targets.KinesisStream(myKinesisStream)
// DLQ を設定しない
);
}
}
上記をデプロイ後、ダッシュボードから Event Rule を確認すると、当然ながら DLQ は設定されていません。
CDK パッケージのアップデート
AWS CDK モジュールを v2.159.0 以上にアップデートします。
npm i aws-cdk-lib@latest aws-cdk@latest
ターゲットに DLQ を設定する
次に DLQ を設定した場合を確認してみます。
先ほどと同様に Kinesis Data streams をターゲットとして Event Rule を構成する CDK コードを作成しますが、今回は event_targets.KinesisStream
クラスで利用可能となった deadLetterQueue
プロパティに SQS キューを指定しています。
import * as events from 'aws-cdk-lib/aws-events';
import * as event_targets from 'aws-cdk-lib/aws-events-targets';
import * as sqs from 'aws-cdk-lib/aws-sqs';
import * as kinesis from 'aws-cdk-lib/aws-kinesis';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
export class CdkSampleStack extends cdk.Stack {
constructor(scope: Construct, id: string) {
super(scope, id);
const myKinesisStream = new kinesis.Stream(this, 'MyKinesisStream');
const myQueue = new sqs.Queue(this, 'MyQueue');
const everyMinuteEventRule = new events.Rule(this, 'EveryMinuteEventRule', {
schedule: events.Schedule.rate(cdk.Duration.minutes(1)),
});
everyMinuteEventRule.addTarget(
new event_targets.KinesisStream(myKinesisStream, {
deadLetterQueue: myQueue, // DLQ を設定
})
);
}
}
Git diff で CDK コードの差分を確認した様子です。
$ git diff lib/cdk-sample-stack.ts
diff --git a/lib/cdk-sample-stack.ts b/lib/cdk-sample-stack.ts
index 405c420..24bb7d1 100644
--- a/lib/cdk-sample-stack.ts
+++ b/lib/cdk-sample-stack.ts
@@ -1,5 +1,6 @@
import * as events from 'aws-cdk-lib/aws-events';
import * as event_targets from 'aws-cdk-lib/aws-events-targets';
+import * as sqs from 'aws-cdk-lib/aws-sqs';
import * as kinesis from 'aws-cdk-lib/aws-kinesis';
import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
@@ -10,12 +11,16 @@ export class CdkSampleStack extends cdk.Stack {
const myKinesisStream = new kinesis.Stream(this, 'MyKinesisStream');
+ const myQueue = new sqs.Queue(this, 'MyQueue');
+
const everyMinuteEventRule = new events.Rule(this, 'EveryMinuteEventRule', {
schedule: events.Schedule.rate(cdk.Duration.minutes(1)),
});
everyMinuteEventRule.addTarget(
- new event_targets.KinesisStream(myKinesisStream)
+ new event_targets.KinesisStream(myKinesisStream, {
+ deadLetterQueue: myQueue,
+ })
);
}
}
CDK Diff を確認すると、作成された SQS キューが Event Rule の DeadLetterConfig に設定されています。
$ npx cdk diff
Stack CdkSampleStack
Hold on while we create a read-only change set to get a diff with accurate replacement information (use --no-change-set to use a less accurate but faster template-only diff)
Resources
[+] AWS::SQS::Queue MyQueue MyQueueE6CA6235
[~] AWS::Events::Rule EveryMinuteEventRule EveryMinuteEventRule061EE897
└─ [~] Targets
└─ @@ -6,6 +6,14 @@
[ ] "Arn"
[ ] ]
[ ] },
[+] "DeadLetterConfig": {
[+] "Arn": {
[+] "Fn::GetAtt": [
[+] "MyQueueE6CA6235",
[+] "Arn"
[+] ]
[+] }
[+] },
[ ] "Id": "Target0",
[ ] "RoleArn": {
[ ] "Fn::GetAtt": [
✨ Number of stacks with differences: 1
CDK デプロイ後、ダッシュボードから Event Rule を確認すると、DLQ が設定されていることを確認できました。
おわりに
AWS CDK で、Kinesis Data streams をターゲットとした EventBridge Rules に DLQ を簡単に設定可能になっていたのでご紹介しました。
DLQ を設定することで、ターゲットへの配信が失敗した際にもメッセージを喪失せずに保持したり、後から再処理させたりすることができます。その設定がエスケープハッチを使わずに L2 Construct で簡単にできるようになったのは嬉しいですね。
以上